home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48hor2 / rpl48.doc < prev    next >
Text File  |  1995-03-31  |  69KB  |  1,706 lines

  1.  
  2.  
  3.                        #####  #####  #       #   ### 
  4.                         #   #  #   # #      ##  #   # 
  5.                         #   #  #   # #     # #  #   # 
  6.                         ####   ####  #    #  #   ### 
  7.                         # #    #     #    ##### #   # 
  8.                         #  #   #     #       #  #   # 
  9.                         #   #  #     ####    #   ### 
  10.  
  11.  
  12.  
  13.  
  14.                A SYSTEM-RPL DEVELOPMENT TOOLKIT FOR THE HP48SX 
  15.  
  16.  
  17.  
  18.                               Version 1.12 beta 
  19.  
  20.  
  21.                (c) 1993 by Detlef Mueller & Raymond Hellstern 
  22.  
  23.  
  24. CONTENTS 
  25. ======== 
  26.  
  27.  
  28. 1. Introduction 
  29.     1.1 Copyrights & Acknoledgements 
  30.     1.2 The RPL48 Toolkit 
  31.     1.3 Requirements & Installation Instructions 
  32.     1.4 Abbreviations 
  33.  
  34. 2. <-RPL-> Library 
  35.     2.1 Overview 
  36.     2.2 The System-RPL Compiler/Decompiler 
  37.     2.3 The Saturn Assembler/Disassembler 
  38.         2.3.1 The Assembler Parameter Field Parser 
  39.     2.4 The Reference Table 
  40.     2.5 Command Reference 
  41.     2.6 Hooks 
  42.     2.7 Things to Notice 
  43.  
  44. 3. <-LIB-> Library 
  45.     3.1 Overview 
  46.     3.2 Control Variables 
  47.     3.3 Command Reference 
  48.     3.4 Things to Notice 
  49.  
  50. Appendix A - Quick Reference Guides 
  51.     A.1 <-RPL-> 
  52.         A.1.1 Commands 
  53.         A.1.2 Flag Usage 
  54.         A.1.3 Error Messages 
  55.     A.2 <-LIB-> 
  56.         A.2.1 Commands 
  57.         A.2.2 Flag Usage 
  58.         A.2.3 Error Messages 
  59.  
  60. Appendix B - A ->COD Example 
  61.  
  62. Appendix C - Ordering Information 
  63.  
  64.  
  65. 1. Introduction 
  66. =============== 
  67.  
  68.  
  69. 1.1 Copyrights & Acknowledgements 
  70. --------------------------------- 
  71.  
  72. All files of the RPL48 toolkit are copyrighted (c) by Detlef Mueller and 
  73. Raymond Hellstern, 1991-1993 - unless otherwise noted. 
  74.  
  75. The RPL48 package is distributed in the hope that it will be useful, but 
  76. RPL48 is provided 'as is,' and is subject to change without notice. 
  77. D. Mueller and R. Hellstern makes no warranty of any kind with regard to 
  78. the software or documentation, including, but not limited to, the implied 
  79. warranties of merchantability and fitness for a particular purpose. 
  80. D.Mueller and R.Hellstern shall not be liable for any error or for incidental 
  81. or consequential damages in connection with the furnishing, performance, or 
  82. use of this software and documentation. 
  83.  
  84. Please excuse all the linguistic errors in this text. English is not our 
  85. native language. 
  86.  
  87. This version of RPL48 is a GiftWare release - you may use it as long as you 
  88. like - without registration for developing non-commercial software only. 
  89. Permission to copy the whole, unmodified RPL48 package is granted provided 
  90. that the copies are not made or distributed for resale (excepting nominal 
  91. copying fees). If you want to get your own, brand new version and for further 
  92. information please refer to Appendix C. 
  93.  
  94. It should be impossible to crash your HP48 by using RPL48, but no software is 
  95. bug free and the <-RPL->:4.1 library (serial no. 113) is still a beta release. 
  96.  
  97. We would like to thank the following persons for their support: 
  98.  
  99.     Wlodek Mier-Jedrzejowicz for presenting RPL48 to the world. 
  100.     Rick Grevelle for the HACKIT library, the ->DIR command in the <-LIB-> 
  101.       library, the base of the sys-stack, many suggestions and exiting talks. 
  102.     Mika Heiskanen for beta testing, lots of suggestions, MKROM and DEBUG. 
  103.     Joseph K. Horn for beta testing and suggestions, the `HP 48 Resource 
  104.       Allocation Guideline; Library ID's`, SORTLS and for maintaining the 
  105.       HP48 Goodies Disks. 
  106.     Carlos Ferraro for beta testing. 
  107.     Simone Rapisarda for beta testing and many suggestions. 
  108.     Fatri Mohamed, Romain Desplats, Georg Hoppen for suggestions and beta 
  109.       testing. 
  110.     James H. Cloos, Steve VanDevender, Chris Maksymiak for suggestions. 
  111.     Chris Spell for maintaining the HP48 archive at seq.uncwil.edu and for 
  112.       moderating comp.sources.hp48. 
  113.     W.C.Wickes & HP Corvallis for the HP48 and the RPL tools. 
  114.     D. York for the friendly permission to publish the BNF parser generator 
  115.       example. 
  116.  
  117.  
  118. 1.2 The RPL48 Toolkit 
  119. --------------------- 
  120.  
  121. The RPL48 Toolkit provides more than 50 powerful commands to aid program and 
  122. library development on a HP48 using system RPL and assembler. It consists of 
  123. three parts: 
  124.     - Library 1234, <-RPL->:4.1 - Contains a sys-RPL compiler/decompiler and 
  125.       Saturn assembler/disassembler. 
  126.     - Library 1221, <-LIB->:1.7 - Contains a library maker/splitter and many 
  127.       commands for handling libraries and un-/supported objects. 
  128.     - a reference table which contains addresse/name pairs of ROM entry points. 
  129.  
  130. The main commands of RPL48 are modelled after the MS-DOS programs RPLCOMP.EXE, 
  131. SASM.EXE and USRLIB.EXE which are provided by HP in the self extracting 
  132. archive TOOLS.EXE (available on several ftp sites). This document describes 
  133. the interface to RPL48; it is not a sys-RPL or Saturn assembler manual. Please 
  134. refer to RPLMAN.DOC, RPLCOMP.DOC, USRLIB.DOC and SASM.DOC (all contained in 
  135. TOOLS.EXE) for learning and/or reference purposes.  [Note: RPLMAN.DOC etc can 
  136. be found on Goodies Disk #4.  -jkh-] 
  137.  
  138. We assume that you are familar with sys-RPL, Saturn assembler and libraries. 
  139.  
  140.  
  141. 1.3 Requirements & Installation Instructions 
  142. -------------------------------------------- 
  143.  
  144. RPL48 runs on ROM version A-E HP48SX; it may run on ROM version J, but it is 
  145. not tested yet ! 
  146.  
  147. The <-RPL-> library it compiled to a fixed address; it MUST be stored in an 
  148. independent (FREEd) port (1 or 2) - thus it only works on a HP48SX. Because 
  149. the whole RPL48 kit requires ~60kb of memory (including a reference table made 
  150. from the latest entries released by HP) it is recommended to store it into a 
  151. 128k RAM card. The <-LIB-> library is developpt using the standard methods, 
  152. it can be stored and used in port 0 on a HP48S. 
  153.  
  154. For a complete installation of RPL48 it is neccessary that you have plugged in 
  155. a 128k RAM card (which must have ~60kb free space) in either port 1 or 2 of 
  156. your HP48SX; the card must be set to R/W. Proceed as follows: 
  157.     - remove any old versions 
  158.     - merge the port 
  159.     - download RPL.TAB, LIB.LIB and RPL.LIB 
  160.     - recall RPL.TAB to the stack, purge RPL.TAB and store it as a backup 
  161.       object named RPL.TAB (case sensitive !) into port 0 (:0:RPL.TAB STO) 
  162.     - recall the two libraries, purge the variables containing the original 
  163.       copies and store the libraries into port 0 (two times 0 STO) 
  164.     - free the port, make sure that :0:1234 is the 1st entry of the list in 
  165.       level 2 for the FREE command ! (you can use 0 PVARS DROP to generate the 
  166.       base list) 
  167.     - power cycle your HP48SX or press [ON]-[C] 
  168.  
  169. As mentioned, <-RPL-> is compiled to an absolute address. Its config code 
  170. takes care of the address the library is stored at. If neccessary, the base 
  171. addresses of the ports are swapped and an additional warmstart is initiated 
  172. automatically while executing the first warmstart after installation. If the 
  173. config code recognizes that it is impossible to change to the correct address 
  174. (ie. the library is stored in port 0 or not the 1st object of port 1 or 2), 
  175. the autoattach to the home directory is supressed and no (c)-message and no 
  176. beep is generated. If the library did not attach itself, make sure it becomes 
  177. the 1st object of port 1 or 2 and execute a warmstart again. 
  178.  
  179. If you have installed a HP41 emulator card, <-RPL-> does not install because 
  180. the emulator uses a similar scheme to install itself to the same address (it 
  181. is also an absolute library) -- just remove the card. 
  182.  
  183. The <-RPL-> and the <-LIB-> libraries are not self-modifing - you can write 
  184. protect the card containing the libraries. 
  185.  
  186.  
  187. 1.4 Abbreviations 
  188. ----------------- 
  189.  
  190. LID   - library id; a number in the range 0..2047, part of any library, It is 
  191.         used by the HP firmware to identify libraries while resolving commands, 
  192.         messages et c. 
  193. |     - used in stack diagrams for 'or' 
  194.  
  195. Abbreviations denoting objects: 
  196.  
  197. ob      object of any type 
  198. xlib    named or unnamed library command 
  199. :x:y    tagged object - tag x, ob y 
  200. prg     program (secondary) 
  201. bak     backup 
  202. dir     directory 
  203. alg     algebraic 
  204. lib     library 
  205. libdta  library data 
  206. meta(t) meta object, obn .. ob1 %n, all ob's are of the same type t 
  207.  
  208. All other abbreviations are defined in RPLMAN.DOC (eg. %, #). 
  209.  
  210.  
  211. 2. <-RPL-> Library 
  212. ================== 
  213.  
  214.  
  215. 2.1 Overview 
  216. ------------ 
  217.  
  218. <-RPL-> contains 17 commands, including a sys-RPL compiler (->RPL), a sys-RPL 
  219. decompiler (RPL->), a Saturn assembler (->COD), a Saturn disassembler (COD->) 
  220. a RPL.TAB browser (EC) and a medium font sys-stack display (4/5/7). 
  221.  
  222.  
  223. 2.2 The System-RPL Compiler/Decompiler 
  224. -------------------------------------- 
  225.  
  226. The compiler is a simple token based one pass LR compiler and implements a 
  227. grammatical subset of RPLCOMP.EXE. It accepts string objects containing a 
  228. token sequence as input. Tokens must be seperated by whitespace (NL,CR,Space, 
  229. TAB etc.). 
  230.  
  231. The output of the decompiler can be used as input for the compiler or (with 
  232. minor modifications) as input for RPLCOMP.EXE. 
  233.  
  234. When ->RPL is compiling a string, it recognizes certain words and generates 
  235. appropriate code for them. All other words are assumed to be the labels of 
  236. objects in the runstream and are emitted simply as 5-nibble constants - the 
  237. reference table (see below) and the assembler symbol table are searched to 
  238. resolve the appropriate 5-nibble addresses. If an entry can't be found in one 
  239. of the tables and its 1st chararcter is a 'x', then ->RPL will try to resolve 
  240. the word without the leading 'x' as a built-in command (e.g. for 'xDROP' the 
  241. address #1FBD8 is generated). 
  242.  
  243. If the current token of ->RPL isn't resolvable as an object, entry or built 
  244. in, it is passed to the user-RPL compiler palparse. If the result is an ID or 
  245. prg, an error will be generated. If the token is parsed to a %, it will be 
  246. converted to a # (eg. "12345" ->RPL --> <3039h> (negative values are mapped 
  247. to 0 and fractional parts are ignored)); any other valid object is simply 
  248. added to the runstream (eg. [[1,2][3,4]] (F(.)) inserts a 2*2 array of reals). 
  249.  
  250. The following words are recognized by ->RPL or generated by RPL->: 
  251.  
  252. LAM <id> 
  253.     DOLAM object whose name is specified by <id>. (1) 
  254.  
  255. ID <id> 
  256.     DOIDNT object whose name is specified by <id>. 0-ID isn't supported by 
  257.     ->RPL. (1) 
  258.  
  259. TAG <id> <ob> 
  260.     DOTAG object whose tag is specified by <id> and whose object is given 
  261.     by <ob>. 
  262.  
  263. $ "string" 
  264.     DOCSTR object with the contents contained between the quotes. (1) 
  265.  
  266. CHR <char> 
  267.     DOCHAR object with the specified character. (1) 
  268.  
  269. # <hex no> 
  270. #<hex no> 
  271.     DOBINT object whose body is the number specified in hex. (3) 
  272.  
  273. % <real no> 
  274.     DOREAL object with the specified floating-point number. 
  275.  
  276. %% <extended real no> 
  277.     DOEREL object with the specified floating-point number. The number is 
  278.     parsed with % resolution. 
  279.  
  280. C% <real no> <real no> 
  281.     DOCMP object with the specified floating-point numbers. 
  282.  
  283. C%% <extended real no> <extended real no> 
  284.     DOECMP object with the specified floating-point numbers. The numbers are 
  285.     parsed with % resolution. 
  286.  
  287. PTR <hex #> 
  288.     Forces the <hex #> to be entered as a runstream pointer-obj. 
  289.  
  290. ROMPTR <hex #> <hex #> 
  291.     DOROMP object with the two 3-digit (maximum) hex numbers. 
  292.  
  293. HXS <length in hex> <string> 
  294. GROB <length in hex> <string> 
  295. CODE <length in hex> <string>           (2) 
  296. ARRY <length in hex> <string>           (2) 
  297. LNKARRY <length in hex> <string>        (2) 
  298. LIBRARY <length in hex> <string>        (2) 
  299. BACKUP <length in hex> <string>         (2) 
  300. LIBDAT <length in hex> <string>         (2) 
  301. EXT1 <length in hex> <string>           (2) 
  302. EXT2 <length in hex> <string>           (2) 
  303. EXT3 <length in hex> <string>           (2) 
  304. EXT4 <length in hex> <string>           (2) 
  305.     Specified object whose body is made from the hex-string. 0-ob's aren't 
  306.     supported by ->RPL. 
  307.  
  308. NIBB <length in hex> <string>           (2) 
  309.     Adds the binary form of <string> to the runstream, eg. NIBB 7 84E2000 
  310.     creates a 0-ID. 
  311.  
  312. CODE <assembler source ..> ENDCODE 
  313.     CODE object, the assembler is called to assemble the body. 
  314.  
  315. ASSEMBLE <assembler source ..> RPL 
  316.     The assembler is used to create the inline code. 
  317.  
  318. INCLUDE <name> 
  319.     The accessable path is searched for a variable with the name <name>. Its 
  320.     contens must be a compilable string and may contain further INCLUDE 
  321.     statements. The resulting code is inserted at the position of the INCLUDE 
  322.     statement. 
  323.  
  324. INCLOB <name>                           (2) 
  325.     The accessable path is searched for a variable with the name <name>. Its 
  326.     recalled contens is inserted at the position of the INCLOB statement. 
  327.  
  328.  
  329. The following words defines runstream pointer-objects: 
  330.  
  331. UNIT    DOEXT  - Unit start 
  332. SYMBOL  02AB8  - Symbolic start 
  333. ::      DOCOL  - Program start 
  334. {       DOLIST - List start 
  335. }       SEMI   - List terminator 
  336. ;       SEMI   - Program, UNIT or SYMBOL terminator 
  337.  
  338.  
  339. Text surrounded by ' (' and ') ' is ignored by ->RPL. 
  340.  
  341.  
  342. Before you start compiling own objects, play with the decompiler to get some 
  343. examples of the syntax definitions, eg. try { + } 1 GET RPL-> to see what '+' 
  344. does. 
  345.  
  346.  
  347. Note (1) 
  348.     Character substitution is supported via '\xxx' in strings, IDs, LAMs and 
  349.     CHRs using the internal routine which does the tranlsation for TRANSIO, 
  350.     code 3 (see the HP48 manual for a comlete description). You must use 
  351.     '\034' to insert doublequotes (") into strings. 
  352.     RPL-> generates (") within strings, not \034. 
  353.  
  354. Note (2) 
  355.     These statements are not compatible to RPLCOMP.EXE. 
  356.  
  357. Note (3) 
  358.     ->RPL accepts BINTS in one of the following form: 
  359.         # xxx - allways compiled to BINT objects 
  360.         #xxx  - searches the ROM for a BINT with the appropriate value, if 
  361.                 found a pointer to is generated instead of a BINT object 
  362.         xxx   - real numbers are COERCED and then handled like #xxx 
  363.  
  364.  
  365. 2.3 The Saturn Assembler/Disassembler 
  366. ------------------------------------- 
  367.  
  368. The assembler defines a subset of SASM.EXE written by Nathan Zelle. You can 
  369. use it 'stand-alone' or in conjunction with the RPL compiler ->RPL. It's a 
  370. 2-pass assembler. 
  371.  
  372. The input string should be plain ASCII (with blanks and/or TAB's) generated on 
  373. a PC or the HP48 itself. 
  374.  
  375. It is 'free format' which means that no coloumn counting is required, except 
  376. that labels MUST begin in the first coloumn of a line. 
  377.  
  378. If a line only consists of a comment, in coloumn 1 MUST be a '*'. Empty lines 
  379. are skipped. 
  380.  
  381. The general line structure is: "<Label> [<Mnemonic> <Modifier> <Comment>]" or 
  382. "* Comment"; the fields are seperated by blanks or TABs. 
  383.  
  384. Most parameters can be symbolic (eg. " GOVLNG (=SAVPTR)+45*3" is valid). 
  385.  
  386. The assembler supports 'conditional assembly' as well as defining equates via 
  387. "Label  EQU  expression". Please refer to SASM.DOC for more details. 
  388.  
  389. You can call 'global' entry points, if a reference table is installed. 
  390.  
  391. A predefined standard macro named LOOP is also included. If entered as 
  392. mnemonic (without parameter) it will be assembled to " GOVLNG  =Loop", an 
  393. address which simply does 
  394.  
  395. =Loop A=DAT0  A 
  396.       D0=D0+  5 
  397.       PC=(A) 
  398.  
  399. If the assembler source don't contain any code, the 2nd pass is skiped to 
  400. speed up RPL define like constructs - eg. a directory may hold along with 
  401. the source strings a variable HEADER: 
  402.  
  403. (HEADER) 
  404. ASSEMBLE 
  405. @a EQU =1GETLAM 
  406. !a EQU =1PUTLAM 
  407. @b EQU =2GETLAM 
  408. !b EQU =2GETLAM 
  409. nr EQU =TWO 
  410. RPL 
  411.  
  412. which may be included by a source like: 
  413.  
  414. (xyz) 
  415. INCLUDE HEADER 
  416. :: 
  417.   CKN 
  418.   DUP nr #<> case SETSIZEERR 
  419.  
  420.   ' NULLLAM nr NDUPN {}N BIND 
  421.  
  422.   @a @b 2DUP EQUAL ?SWAP 
  423.   !b !a 
  424.         (...etc...) 
  425.   ABND 
  426.  
  427.  
  428. 2.3.1 The Assembler Parameter Field Parser 
  429. ------------------------------------------ 
  430.  
  431. Parameter fields are parsed by an expresion parser that is defined as follows: 
  432.  
  433.     expr : expr op1 term | term 
  434.     term : term op2 fact | fact 
  435.     fact : '(' expr ')' | op3 fact | '(' '=' entry ')' | '(' symbol ')' | num 
  436.  
  437.     op1  : '+' | '-' | '!' | '|' | '^' 
  438.     op2  : '*' | '/' | ':' 
  439.     op3  : '-' | '"' 
  440.  
  441.     num  : real-number | '#' hxs-number 
  442.  
  443.     entry  : label of RPL.TAB 
  444.     symbol : label of the assembler symbol table 
  445.  
  446.     op  action 
  447.     --  ------ 
  448.     *   multiply 
  449.     /   divide 
  450.     :   modulo 
  451.     "   ones complement 
  452.     -   subtract / twos complement 
  453.     +   add 
  454.     !   bit AND 
  455.     |   bit OR 
  456.     ^   bit XOR 
  457.  
  458. A complete expr must not contain whitespace chars. If an expression consists 
  459. only of a '#' number, an entry or a symbol, the parenteses aren't neccessary 
  460. (eg. @n EQU =1GETLAM ). Real numbers are converted internally to HXS numbers, 
  461. the accuracy is 64 bit. Parsing real numbers and hex numbers is done by the 
  462. '48 internal real/hex parser. The expr/term/fact parser are using the solver 
  463. token type table. 
  464.  
  465. Expressions of EQU parameter fields must resolve to the requested number 
  466. during the 1st assembler pass; they are ignored in the 2nd pass. 
  467.  
  468.  
  469. 2.4 The Reference Table 
  470. ----------------------- 
  471.  
  472. RPL->, ->RPL, COD->, ->COD, EC, E<->A and 4/5/7 are looking for a reference 
  473. table named RPL.TAB which will be used to resolve names and addresses of ROM 
  474. entry points. It may be stored in a variable, as a backup object in any port 
  475. or as a library command. If RPL.TAB exists, its recalled contens will be 
  476. evaluated and if the result is a string starting with '\000\010' it will be 
  477. used as a reference table. It is recommended to use the table shipped with 
  478. RPL48; it is made using the latest entries list released by HP as database - 
  479. double named entries are removed and a few user-RPL names are added to avoid 
  480. conflicts when decomling different '->', '>>', 'END' et c. 
  481.  
  482. For generating own tables use GENTAB.C, also shipped with RPL48. 
  483.  
  484. The following example (HP terminology) outlines the structure of a reference 
  485. table: 
  486.  
  487. ASSEMBLE 
  488.         CON(5)  =DOCSTR         String prologue 
  489.         REL(5)  TabEnd          Length field 
  490.         NIBASC  '\00\n'         Reference table identifier 
  491. *                               A hash table, for each char from ' '-DEL 
  492. *                               a 5-nib offset into the table 
  493.         CON(5)  0               ' ' entry, empty 
  494.         REL(5)  _!_             relativ offset to words starting with '!' 
  495.         CON(5)  0               '"' entry, empty 
  496. *       ...                     '#' - 'C' 
  497.         REL(5)  _D_             'D' entry 
  498. *       ...                     'E' - '}' 
  499.         CON(5)  0               '~' entry, empty 
  500.         CON(5)  TabEnd          DEL entry, always TabEnd 
  501.  
  502. _!_ 
  503.         CON(6)  #9623A0 
  504.         NIBASC  `!!append$` 
  505. *       ... 
  506. _D_ 
  507. *                +------- Lenght of the label in bytes. 
  508. *                |        A label can't be > 15 chars in size. 
  509. *                |+++++-- Address associated to the label, here 074E4 
  510. *                |||||| 
  511.         CON(6)  #6074E4         Address/length field of the following 
  512.         NIBASC  'DOBIND'        Label 
  513.  
  514. TabEnd 
  515. RPL 
  516.  
  517.  
  518. 2.5 Command Reference 
  519. --------------------- 
  520.  
  521. RPL->           ( ob                    --> $                           ) 
  522.     Decompiles an object into a string. The string can be used as input for 
  523.     ->RPL without modifications (most times). 
  524.  
  525.  
  526. ->RPL           ( $                     --> ob                          ) 
  527.     Compiles the input string into an object. 
  528.  
  529.  
  530. DCADR           ( hxs[adr]              --> $ hxs[adr]'                 ) 
  531.     Decompiles the object referenced by the address adr into a string in 
  532.     level 2 and increment the address by the object size. 
  533.  
  534.  
  535. COD->           ( code                  --> $                           ) 
  536.     Disassembles a code object, generates HP styled mnemonics. The reference 
  537.     table is searched for addresses of GO and Dx=(5) mnemonics. The string 
  538.     can be used as input for ->COD without modifications (most times). 
  539.  
  540.  
  541. ->COD           ( $                     --> code LibDat                 ) 
  542.     Assembles a code object. LibDat is the compressed form of a cross 
  543.     reference listing, use SYM-> (see below) for decompression. 
  544.  
  545.  
  546. ->OB            ( hxs[adr]              --> ob                          ) 
  547.                 ( #adr                  --> ob                          ) 
  548.                 ( XLIB                  --> ob                          ) 
  549.                 ( ob                    --> ob'                         ) 
  550.     Input       Action 
  551.     -----       ------ 
  552.     hxs         Build a pointer, pointing to the address given by the value 
  553.                 of hxs[adr]. 
  554.     #           Same as for hxs, except if the value of # points to a valid 
  555.                 ob in the hidden ROM; in this case the object is copied into 
  556.                 TEMPOB. Eg. "# 72000" ->RPL ->OB returns the message table 
  557.                 of the internal library 0. 
  558.     XLIB        Does a rompointer recall. 
  559.     ob          Unconditionally TOTEMPOB. 
  560.  
  561.  
  562. DAN             ( hxs[adr] %n           --> $1 .. $n hxs[adr]'          ) 
  563.     Disassembles n instructions starting at address hxs[adr]. 
  564.  
  565.  
  566. DA1             ( hxs[adr]              --> $ hxs[adr]'                 ) 
  567.     Disassembles the instruction at address hxs[adr]. 
  568.  
  569.  
  570. DAXY            ( hxs[start] hxs[end]   --> $                           ) 
  571.     Disassembles until the actual adr. is > hxs[end], starting at address 
  572.     hxs[start]. 
  573.  
  574.  
  575. SYM->           ( LibDat                --> $                           ) 
  576.     Converts the cross reference table produced by ->COD into a string. 
  577.  
  578.  
  579. $->             ( $                     --> ob                          ) 
  580.     Converts a hex-dump to an object. 
  581.  
  582.  
  583. ->$             ( ob                    --> $                           ) 
  584.     Generates a hex-dump of an object. 
  585.  
  586.  
  587. EC              (                       --> ?                           ) 
  588.     Entries Catalog - the reference table browser. Errors if no RPL.TAB 
  589.     can be found. 
  590.  
  591.     When starting EC the first time, it'll create the variable ECpar in 
  592.     the HOME directory. It contains a HXS that is used by EC as a lookup 
  593.     table into RPL.TAB; you may store the variable into a port (like 
  594.     RPL.TAB). Any time you install a new reference table it is neccessary 
  595.     to purge ECpar ! 
  596.  
  597.     Active keys in the main display of EC: 
  598.       UP    - move scroll bar up one word 
  599.       DOWN  - move scroll bar donw one word 
  600.       ENTER - push highlighted word as $ onto the stack. If EC is launched 
  601.               from a command/edit line, ENTER coppies the word into the 
  602.               editline starting at the current cursor position 
  603.       NXT   - scan for next occurence of the SCAN word. Doesn't scan the 
  604.               current page 
  605.       ON    - exit EC or cancel sub-action 
  606.       OFF   - turn off 
  607.  
  608.       Menu keys: 
  609.         PG|^  - page up 
  610.         PG|v  - page down 
  611.         SCAN  - prompts for a $ to search, ENTER starts searching. If 
  612.                 EC is launched from a command/edit line, the prompt looks 
  613.                 suspicious, but its functionality is the same 
  614.         A-Z   - try it 
  615.         ADR?  - displays the address of the current word. A 'r' behind the 
  616.                 address marks RPL entries. Words not marked are propably 
  617.                 for use within assembler only. If EC is launched from a 
  618.                 command/edit line, this function is disabled. 
  619.         A->ST - push the address of the current word onto the stack. If EC is # 
  620.                 launched from a command/edit line, this function is disabled. 
  621.  
  622.     For use of EC within a normal edit line, append the following program to 
  623.     your CST variable and launch EC with CST EC: 
  624.         :: TakeOver ROMPTR 4D2 C (EC) ; 
  625.  
  626.  
  627. E<->A           ( hxs[adr] | $name      --> $name | hxs[adr]            ) 
  628.     Searches the reference table for a name or address of a given address or 
  629.     name. 
  630.  
  631.  
  632. RPLtab          (                       --> $                           ) 
  633.     Tries to recall the ref. table via RPL.TAB. If no table is found, a 
  634.     zero-length string is returned. 
  635.  
  636.  
  637. 4/5/7           (                       -->                             ) 
  638.     Starts the medium font sys-stack display in five line mode. Pressing 
  639.     4/5/7 in five line mode switches to seven line mode, in seven line mode 
  640.     the sys-stack is canceled. 
  641.  
  642.     The following actions are redefined while the 5/7 stack is active: 
  643.       - pressing the up arrow without an active edit/commandline starts a 
  644.         5/7 level interactive sys-RPL stack 
  645.       - pressing the down arrow without an active edit/commandline starts 
  646.         editing the object of stack level one in sys-RPL syntax 
  647.  
  648.     If you have flag -29 set, the i-stack allows you to edit objects in 
  649.     sys-RPL syntax when pressing the EDIT menu key. 
  650.  
  651.         YOU MUST NOT MOVE THE <-RPL-> LIBRARY WHILE 4/5/7 IS ACTIVE !! 
  652.     (ie. DON'T MERGE THE PORT WHERE <-RPL-> IS STORED WITH AN ACTIVE 4/5/7 !!) 
  653.  
  654.     Clear flag -27 to quit 4/5/7 if you want to purge/move <-RPL->. 
  655.  
  656.  
  657. CC              (                       --> ?                           ) 
  658.     Character set Catalog. CC displays a map of 128 characters in the small 
  659.     font along with some more information for the highlighted char. You can 
  660.     move through the map with the cursor keys. If you hold down one of the 
  661.     cursor keys, it will repeat until you release. The ON-key exits the 
  662.     program, BLUE-ON turns the calc off and ENTER fetches the char number 
  663.     (tagged with the char) to the stack. 
  664.  
  665.     There are three menu keys available: 
  666.       SWAP - swaps between the upper/lower half of the char set 
  667.       BIN  - toggles the char code display from real/hex to binary and back 
  668.       EXIT - leaves CC 
  669.  
  670.     If you launch CC within an active editline (eg. via the CST menu), ENTER 
  671.     will copy the highlighted character into the editline to the current 
  672.     cursor position. For use of CC within a normal edit line, append the 
  673.     following program to your CST variable and launch CC with CST CC: 
  674.         :: TakeOver ROMPTR 4D2 10 (CC) ; 
  675.  
  676.  
  677. 2.7 Hooks 
  678. --------- 
  679.  
  680. There are a few user hooks in <-RPL->, each an unnamed ROMPTR. 
  681.  
  682. ROMPTR 4D2 13   (                       -->                             ) 
  683.     Switches to ADISP and displays a 5/7 level sys-RPL stack. 
  684.  
  685. ROMPTR 4D2 14   (                       -->                             ) 
  686.     Errors if <-RPL-> isn't ATTACHed to the HOME directory. 
  687.  
  688. ROMPTR 4D2 15   ( ob                    --> $                           ) 
  689.     Decompiles an object in quiet mode, eg. for editing. 
  690.  
  691. ROMPTR 4D2 16   ( $                     -->                             ) 
  692.     Compiles a string in quiet mode, eg. after editing. 
  693.  
  694.  
  695. 2.7 Things to Notice 
  696. -------------------- 
  697.  
  698. ->RPL maintains a global assembler symbol table while compiling an object, ie. 
  699. it is possible to jump backward from a code object to a previous one: 
  700.  
  701. :: 
  702.   CODE 
  703. Lp LOOP 
  704.   ENDCODE 
  705.   CODE 
  706.    GOTO lp 
  707.   ENDCODE 
  708.  
  709. ->RPL tries to resolve a token in the following order: 
  710.     1. check for atomic object (eg. %, # et c.) 
  711.     2. search reference table 
  712.     3. search symbol table 
  713.     4. check for #<hex-no> 
  714.     5. check for user-RPL word 
  715.     6. check for user-RPL object 
  716.  
  717. The search of the symbol table enables the programmer to use DEFINE like 
  718. constructs: 
  719.  
  720. :: 
  721.   ASSEMBLE 
  722. @val EQU =1GETLAM 
  723. !val EQU =1PUTLAM 
  724.   RPL 
  725.  
  726.   ONE 1LAMBIND 
  727.   @val #1+ !val 
  728.   1GETABND 
  729.  
  730.  
  731. 3. <-LIB-> 
  732. ========== 
  733.  
  734.  
  735. 3.1 Overview 
  736. ------------ 
  737.  
  738. <-LIB-> contains 39 commands, including a library maker (D->LIB), a library 
  739. splitter (L->DIR), commands to handle any sort of composite objects and 
  740. commands to manage libraries. 
  741.  
  742. Libraries are very usefull objects to extend the command set of a HP48 in 
  743. a 'native' manner, but unfortunately library creation is not supported by 
  744. the HP48 firmware. The HP tools package contains the program USRLIB.EXE, 
  745. which provides library creation on a PC; if you want to put your most often 
  746. programs into a library (because of easier handling and to keep your VARs 
  747. area clean), you have to collect them into a subdirectory, add a few control 
  748. variables, transfer the directory in binary form to a PC, run USRLIB.EXE on 
  749. it and transfer the created library back to your HP48, where you can install 
  750. and test the library. 
  751.  
  752. <-LIB-> provides the command D->LIB that works on the currently active 
  753. directory, allowing you to create a library from a directory on the HP48 
  754. itself - no transfers, no PC and no USRLIB.EXE are required. 
  755.  
  756. The input directory stucture of D->LIB is modeled very similar to the 
  757. directory structure required by USRLIB.EXE, thus existing USRLIB.EXE input 
  758. can be used for a library creation with minor changes (the difference is 
  759. the format of the $MESSAGE control variable, see below). 
  760.  
  761.  
  762. 3.2 Control Variables 
  763. --------------------- 
  764.  
  765. The library creation process is controlled by some variables with reserved 
  766. names and only the current directory is searched for its presence (note: 
  767. multiple occurences of these names are ignored, but only the contens of the 
  768. 1st one found in the current directory is used for the library creation 
  769. process): 
  770.  
  771. $ROMID 
  772.     Must contain a real or binary number representing the LID that is to 
  773.     be given to the library. The LID must be in the range 0..2047. Negative 
  774.     real numbers are mapped to 0. 
  775.     This is the only control variable that MUST exist in the current 
  776.     directory ! 
  777.  
  778. $TITLE 
  779.     Should contain a character string to be used as the name of the library 
  780.     (note: any other object than a string is converted to a string). 
  781.     The first few characters of the name are displayed in the LIBRARY menu 
  782.     label associated to the library, the first 22 characters are displayed 
  783.     by pressing REVIEW in the LIBRARY menu. If $TITLE is absent or contains 
  784.     an empty string, no title is generated and the resulting library don't 
  785.     have a menu label in the LIBRARY menu (note: you can switch to the 
  786.     libraries command menu by executing %LID MENU, even the library don't 
  787.     have a name or is not attached). 
  788.  
  789. $CONFIG 
  790.     Must contain a program to be executed at configuration time. 
  791.     The configuration code can generally NOT be written in user-RPL, but 
  792.     simple programs such as \<< 123 ATTACH \>> are Ok - more complicated 
  793.     programs should take care to leave the stack unchanged, and be sure 
  794.     NOT TO ERROR ! An error in a configuration program will cause a warmstart; 
  795.     the configuration code is called again during the startup process, 
  796.     producing a new error etc. If you are accidentally trapped by this, you 
  797.     must clear your memory to remove the faulty library ! 
  798.  
  799. $MESSAGE 
  800.     Must contain a list of strings to be combined into a message table (note: 
  801.     any other objects than strings are converted to strings). The message 
  802.     numbers corresponds to the list positions. In user-RPL you can generate 
  803.     errors with own messages in the following manner: 
  804.             #32001h DOERR 
  805.              |||++-- Message number     (here 1) 
  806.              +++---- LID                (here #320h = 800) 
  807.     In sys-RPL you can use 
  808.             # 32001 ERROROUT 
  809.  
  810.     In this example an error is generated, using the first message from the 
  811.     message table of a library with the LID 800. 
  812.  
  813.     Note: The message list structure is NOT compatible to USRLIB.EXE. 
  814.  
  815. $VISIBLE 
  816.     Must contain a list of names of variables to be converted to user- 
  817.     accessible, named library commands. By default, all variables will be 
  818.     translated to named library commands. When the $VISIBLE list is present, 
  819.     only the names in this list are included in the library hash table. An 
  820.     empty list is Ok, meaning that no hash table is generated. 
  821.  
  822. $HIDDEN 
  823.     Must contain a list of names of variables that are to be converted to 
  824.     unnamed objects in the library. When the $HIDDEN list is present, those 
  825.     names listed are not entered in the library hash table. If both $VISIBLE 
  826.     and $HIDDEN are present, only $HIDDEN will be used. 
  827.  
  828.     Note: all visible commands appears as labeled softkeys in the menu 
  829.     associated to the library, all hidden command not and there is no way 
  830.     to access them from users scope. 
  831.  
  832. $VARS 
  833.     Must contains a list of variables that should remain RAM-based - ei. the 
  834.     objects of the variables listed in $VARS are not included in the library 
  835.     and no XLIB pointers are made to substitute their names. All other 
  836.     variables of the current directory are included in the library. 
  837.  
  838.     Note: You should add all subdirectory names of the current directory to 
  839.     the list. 
  840.  
  841. $ROMID must exist in the current directory, all other control variables are 
  842. optional - you can generate libraries containing only a configuration program 
  843. or a message table. All control variables are internally handled by D->LIB to 
  844. be $VARS and can't be accessed from within the library commands. 
  845.  
  846.  
  847. 3.4 Command Reference 
  848. --------------------- 
  849.  
  850. D->LIB          (                       --> lib                         ) 
  851.  
  852.     Dir to lib; assembles a library from the objects of the current directory. 
  853.     The creation process is controlled by a few variables with reserved names 
  854.     (see '3.3 Control Variables'). 
  855.     If you set flag -13 before running D->LIB, it'll switch off the screen 
  856.     while working (for saving time and batteries). 
  857.  
  858.  
  859. L->DIR          ( %LID                  --> dir                         ) 
  860.                 ( xlib                  --> ob                          ) 
  861.  
  862.     Lib to dir; if the argument is a LID then L->DIR assembles a directory 
  863.     containing all commands of this library as variables. The neccessary 
  864.     control variables (see 3.3) are also generated. L->LIB may be used to 
  865.     recreate the library. 
  866.     If the argument is a XLIB, then L->DIR recalls its object from the 
  867.     associated library onto the stack. 
  868.     If you set flag -13 before running L->DIR on a library, it'll switch off 
  869.     the screen while working (for saving time and batteries). 
  870.  
  871.     Note: You cannot use L->DIR to split <-LIB->, this should prevent users 
  872.     from a memory lost. If you are conform with the internals of your HP48, 
  873.     use 'ROMPTR@' (or ->OB) to extract single routines from <-LIB->, but 
  874.     beware of starting the routines in RAM, most of them will crash your calc 
  875.     when running standalone ! 
  876.  
  877.  
  878. MCFG            (                       -->                             ) 
  879.  
  880.     Make config; stores a configuration program into a variable named 
  881.     '$CONFIG' into the current directory. This configuration program will 
  882.     attach the generated library to the home directory at warmstarts (ON-C 
  883.     etc.). 
  884.     '$ROMID' must exist in the current directory. 
  885.  
  886.  
  887. ML->D           (                       --> prg                         ) 
  888.  
  889.     Generates a program with the following interface: 
  890.  
  891.                 ( {}                    --> libdta                      ) 
  892.  
  893.     The list can contain anything. The program checks for argument count and 
  894.     type and may error with: 
  895.         #201 - To Few Arguments  - nothing on the stack 
  896.         #202 - Bad Argument Type - not a list on the stack 
  897.  
  898.     '$ROMID' must exist in the current directory. 
  899.  
  900.  
  901. MD->L           (                       --> prg                         ) 
  902.  
  903.     Generates a program with the following interface: 
  904.  
  905.                 ( libdta                --> {}                          ) 
  906.  
  907.     The program checks for argument count, type and correct LID and may error 
  908.     with: 
  909.         #201 - To Few Arguments   - nothing on the stack 
  910.         #202 - Bad Argument Type  - no library data on the stack 
  911.         #203 - Bad Argument Value - the libdta wasn't created by this lib 
  912.  
  913.     '$ROMID' must exist in the current directory. 
  914.  
  915.   Note: Store the programs generated by ML->D and MD->L into variables in 
  916.   your source directory and use them as an interface to generate/resolve 
  917.   data associated to the resulting library. 
  918.  
  919.  
  920. OB->            ( prg                   --> ob1 .. obn %n               ) 
  921.                 ( xlib                  --> %LID %objno                 ) 
  922.                 ( arry                  --> ob1 .. obn { %di .. %d1 }   ) 
  923.                 ( alg                   --> ob1 .. obn %n               ) 
  924.                 ( dir                   --> ob1 id .. obn id %n         ) 
  925.                 ( id                    --> $                           ) 
  926.                 ( libdta                --> {} %LID                     ) 
  927.                 ( bak                   --> ob id                       ) 
  928.                 ( id                    --> $                           ) 
  929.                 ( ob                    --> dispatch to OBJ->           ) 
  930.  
  931.     OB-> is an extension to the built-in OBJ->, supporting system level 
  932.     objects. 
  933.  
  934.  
  935. ->DIR           ( ob1 id1 .. obn idn %n --> dir                         ) 
  936. ->PRG           ( ob1 .. obn %n         --> prg                         ) 
  937. ->XLIB          ( %LID %cmdno           --> xlib                        ) 
  938.                 ( #LID #cmdno           --> xlib                        ) 
  939. ->ARR           ( ob1 .. obn %n         --> arry                        ) 
  940.                 ( ob1 .. obn { %di .. %d1 } --> arry                    ) 
  941. ->ALG           ( ob1 .. obn %n         --> prg                         ) 
  942. ->LD            ( {} %LID               --> libdta                      ) 
  943. ->BAK           ( ob id                 --> bak                         ) 
  944. ->ID            ( $                     --> id                          ) 
  945.  
  946.     Functions to reverse OB->. 
  947.  
  948.     About ->ARR: 
  949.        Generates arrays of any type and any dimension (eg. a four dimensional 
  950.        array of libraries :-). 
  951.        %di * .. * %d1 must be = n, ob1 .. obn must be of the same type. 
  952.        All possible parameter errors are trapped. 
  953.  
  954.  
  955. ADRp            ( ob                    --> ob #addr                    ) 
  956.  
  957.     Get address of ob. 
  958.  
  959.     Note: The data stack is a stack of pointer to objects. ADRp simply returns 
  960.     the value from the top element (about the 'p', see 'LIBp' below). 
  961.  
  962.  
  963. $romid 
  964. $visible 
  965. $title 
  966. $config 
  967. $vars 
  968. $hidden 
  969. $message        (                       --> '$XXX'                      ) 
  970.  
  971.     These commands just put a control variable name onto the stack. 
  972.  
  973.  
  974. LBCRC           ( lib                   --> lib'                        ) 
  975.                 ( bak                   --> bak'                        ) 
  976.  
  977.     Recalculates the CRC of a library or backup, usefull if you have patched 
  978.     it because modifying the body of a library or backup invalidates the CRC 
  979.     included at the end of the body. 
  980.  
  981.  
  982. RNLIB           ( lib $                 --> lib'                        ) 
  983.  
  984.     Renames a library, ie. changes title. 
  985.  
  986.  
  987. CHLID           ( lib %                 --> lib'                        ) 
  988.  
  989.     Change LID; this program allows you to change the LID of a library if 
  990.     it's not splittable. 
  991.  
  992.     Note: Most time a LID is also hardcoded in the config code - this can 
  993.     generally not be changed by CHLID. You have to attach the library manually 
  994.     after a warmstart. Also any library have its LID coded in a field above 
  995.     any visible command (the error handling system identifies the command 
  996.     that caused an error using this field (the sys-RPL commands 'CKn' copies 
  997.     this values to the appropriate location)). These fields are not changed 
  998.     by CHLID (yet). 
  999.  
  1000.  
  1001. RHASH           ( %LID                  --> hxs                         ) 
  1002.  
  1003.     Recall hash table; get a pointer to the hash table of a library. 
  1004.  
  1005.  
  1006. RLINK           ( %LID                  --> hxs                         ) 
  1007.  
  1008.     Recall link table; get a pointer to the link table of a library. 
  1009.  
  1010.  
  1011. RCFG            ( %LID                  --> ob                          ) 
  1012.  
  1013.     Recall config code; get a pointer to the config code of a library. 
  1014.  
  1015.  
  1016. RMSG            ( %LID                  --> arry                        ) 
  1017.  
  1018.     Recall message table; get a pointer to the message table of a library. 
  1019.  
  1020. RTITLE          ( %LID                  --> $                           ) 
  1021.  
  1022.     Recall title; get the name of a library. 
  1023.  
  1024.  
  1025.     Note: RHASH, RLINK, RCFG, RMSG and RTITLE don't error if the library 
  1026.     associated to %LID didn't contain the requested item, they leave the 
  1027.     stack unchanged in that case. 
  1028.  
  1029.  
  1030. RPORT           ( %port                 --> ob1 .. obn                  ) 
  1031.  
  1032.     Recalls pointers to all objects of a given port (0/1/2) onto the stack, 
  1033.     ignoring the R/W status of that port. 
  1034.  
  1035.  
  1036. RLIB            ( :%port:%LID           --> lib                         ) 
  1037.                 ( %LID                  --> libn %portn ...             ) 
  1038.  
  1039.     Recall lib; the 1st case recalls a library from a given port, the 2nd 
  1040.     case searches ports 0,1,2 for libraries with %LID, returning all found 
  1041.     libraries and the port numbers where they're stored. 
  1042.  
  1043.     Note: This command actually returns pointer to libraries (like RPORT), 
  1044.     if you recall a lib and try to purge it while it's on the stack, you'll 
  1045.     get a 'Object in use' error. Execute NEWOB or store it into a variable 
  1046.     first. 
  1047.  
  1048.  
  1049. PGLIB           ( :%port:%LID           -->                             ) 
  1050.                 ( %LID                  -->                             ) 
  1051.  
  1052.     Purge lib; the 1st case works like :%port:%LID PURGE, in the 2nd case the 
  1053.     ports are searched in order 0,1,2 for an active library with %LID. The 
  1054.     difference to PURGE: if the library is attached to the home directory, 
  1055.     it's detached before purging. Also if there is an inactive library with 
  1056.     the same LID in any other port, it becomes active and is attached to the 
  1057.     HOME directory (if flag 5 is set, its config code is executed - see STLIB 
  1058.     below). 
  1059.  
  1060.  
  1061. STLIB           ( lib %port             -->                             ) 
  1062.  
  1063.     Store lib into port; there're a few differences to STO: 
  1064.         - The library is installed full; a warmstart isn't neccessary 
  1065.           and thus not initiated at the next power cycle. All warmstart 
  1066.           volatile variables (stack, PICT) remains intact. 
  1067.         - The library last stored is visible to the HP48 (in case of 
  1068.           having a library with the same LID installed in another port). 
  1069.         - If flag 5 is clear, the library is attached simply to the 
  1070.           home directory. 
  1071.         - If flag 5 is set, the config code of the library is executed 
  1072.           under warmstart conditions. Usefull for testing a config code. 
  1073.  
  1074.  
  1075. ACLIB           ( :%port:%LID           -->                             ) 
  1076.  
  1077.     Activate library. You can install libraries with the same LID in different 
  1078.     ports, but only one will be visible to the HP48 at the time. During 
  1079.     warmstarts the ports are searched in order 2,1,0 (most cases), ie. the 
  1080.     library stored in the port with the highest number will be active. 
  1081.     ACLIB allows you to switch to any other library with the same LID at 
  1082.     runtime, the effect is immidiate. ACLIB 1st detaches the LID from HOME, 
  1083.     sets the new priority and than a) attaches the LID to HOME again if flag 
  1084.     5 is clear, or b) runs the library config code if flag 5 is set (see STLIB 
  1085.     above). 
  1086.  
  1087.  
  1088. LIBp            ( %LID                  --> $                           ) 
  1089.  
  1090.     Returns a detailed layout of a library. The map starts with the title (if 
  1091.     exist), followed by the 1st and last address of the lib and the LID. The 
  1092.     remainder lists the contens of the lib, one line of information for each 
  1093.     XLIB entry. Structure of a line: 
  1094.  
  1095.         1st last  xn name  typ 
  1096.         ||| ||||  || ||||  +++- Type of the object 
  1097.         ||| ||||  || ++++------ Name of the object (if it's a visible cmd) 
  1098.         ||| ||||  ++----------- XLIB number of the object 
  1099.         ||| ++++--------------- Last relative address of the object 
  1100.         +++-------------------- Offset to startaddr. of the object 
  1101.  
  1102.     The list is sorted by offset. Try 1221 LIBp or 2 LIBp. 
  1103.  
  1104.     Note: If you find unexpected 'holes' between two XLIBs (> 10 nibbs) or 
  1105.     XLIBs embedded in other XLIBS, the library wasn't generated using 
  1106.     USRLIB.EXE or D->LIB; do not use D->LIB for recreating it because the 
  1107.     'holes' can hold essential data.. 
  1108.  
  1109.  
  1110. INSTp           (                       --> { %LIDn .. %LID1 }          ) 
  1111.  
  1112.     Returns a list of all libraries attached to the current directory, { } if 
  1113.     none. 
  1114.  
  1115.     Note: You can PURGE libraries even if they are attached to a subdirectory. 
  1116.     INSTp can be used to find such zombies references. 
  1117.  
  1118.  
  1119. LIBSp           (                       --> { %LID1 .. %LIDn }          ) 
  1120.  
  1121.     Returns a list of all libraries currently installed on your HP48. 
  1122.  
  1123.  
  1124.   Note: We didn't use the '?' postfix because normally it marks a routine 
  1125.   for returning a flag in RPL. The JARGON file, v2.9.9, 01 APR 1992 states: 
  1126.  
  1127.     3. The `-P' convention: ------------------------ Turning a word into 
  1128.     a question by appending the syllable `P'; from the LISP convention of 
  1129.     appending the letter `P' to denote a predicate (a boolean-valued 
  1130.     function).  The question should expect a yes/no answer, though it 
  1131.     needn't.  (See {T} and {NIL}.) 
  1132.  
  1133.     At dinnertime: 
  1134.        Q: "Foodp?" 
  1135.        A: "Yeah, I'm pretty hungry." or "T!" 
  1136.  
  1137.     At any time: 
  1138.        Q: "State-of-the-world-P?" 
  1139.        A: (Straight) "I'm about to go home." 
  1140.        A: (Humorous) "Yes, the world has a state." 
  1141.  
  1142.   so we used 'p' for marking routines returning information ;-) 
  1143.  
  1144.  
  1145. fEVAL           ( ob                    --> ?                           ) 
  1146.  
  1147.     Works like EVAL, but switches the display off 1st. Speeds up evaluation 
  1148.     for ~11%. In case of an error or the ob have fineshed execution, the 
  1149.     display is switched on again. Not very usefull, if ob prompts for input.. 
  1150.  
  1151.  
  1152. 3.5 Things to Notice 
  1153. -------------------- 
  1154.  
  1155. +---------------------------------------------------+ 
  1156. | HP 48 Resource Allocation Guideline: Library ID's | 
  1157. +---------------------------------------------------+ 
  1158. | 0000 - 0256  Take-over libraries; do not use!     | 
  1159. | 0257 - 0512  HP ROM-based libraries; do not use!  | 
  1160. | 0513 - 0768  HP RAM-based libraries; do not use!  | 
  1161. | 0769 - 1791  3rd Party (assigned by HP)           | 
  1162. | 1792 - 2047  Command-line; do not use!            | 
  1163. +---------------------------------------------------+ 
  1164.  
  1165. *Don't use the following LIDs*, they're handled special by the HP48: 
  1166.  
  1167. LID             What's special ? 
  1168. ---             ---------------- 
  1169. 240-255         ROMPTR@ assumes that the associated library command is in the 
  1170.                 hidden ROM. 
  1171. 0-256,1792      The central routine to compile IDs (PTR 7BFD) returns pointer 
  1172.                 instead of XLIBs. 
  1173.  
  1174. The library stucture is 'flat', so don't try to include subdirectories in a 
  1175. library, it can end up in a memory lost. 
  1176.  
  1177. Not all program objects that execute correctly from global variables are 
  1178. directly convertible into libraries. Here are some pitfalls: 
  1179.  
  1180.     - Since a library cannot be modified, no library command may be the 
  1181.       target of a STO or PUT operation. 
  1182.     - XLIB names are not usable in all contexts in which global names are 
  1183.       valid arguments. This can cause constructs that reference a named 
  1184.       object to fail. For example, 
  1185.         'A' 5 GETI 
  1186.       where A is a list will not work when A is converted to an XLIB name. 
  1187.       Instead use 
  1188.             A 5 GETI 
  1189.     - XLIB names are not valid as formal variables in algebraics, or as the 
  1190.       independent variable for plotting or solving. 
  1191.     - \->STR applied to a global name that is converted to a 'hidden' library 
  1192.       command (see $HIDDEN) returns a null string. 
  1193.  
  1194. If any visible command starts with the seqence '\<< \->' or '\->' it's marked 
  1195. in the library as a valid command for algebraics. If you press its associated 
  1196. softkey in ALG entry mode, you'll get 'name()'. 
  1197.  
  1198. Multiple occurences of variable names results in an incorrect library because 
  1199. only the contens of the 1st one is picked up. 
  1200.  
  1201. D->LIB needs ~(1.2 * size_of_source_directory) bytes to be free to generate a 
  1202. library. 
  1203.  
  1204. The time D->LIB needs for doing a job depends mainly on the total number of 
  1205. commands included in the resulting library. Eg. Raymond runs D->LIB on a ~60kb 
  1206. directory containing ~300 variables; D->LIB needs ~45min on a rev A HP48 to 
  1207. make the library (not in FAST-mode). 
  1208.  
  1209. Reassembling a splitted library may be dangerous if the original library was 
  1210. not generated using USRLIB.EXE or D->LIB. There is no guarantee that the 
  1211. result will work probably - even if no code changes are done. 
  1212.  
  1213. USRLIB.EXE generates a link table entry for the configuration program; if you 
  1214. split such a library with L->DIR, you'll get the configuration code twice, the 
  1215. 1st one stored in $CONFIG, the 2nd one stored in a variable of the generated 
  1216. directory. Purge the variable before using D->LIB. You also can use LIBp to 
  1217. see the second reference to the config code. 
  1218.  
  1219.  
  1220. Appendix A - Quick Reference Guides 
  1221. =================================== 
  1222.  
  1223.  
  1224. A.1 <-RPL-> 
  1225. ----------- 
  1226.  
  1227.  
  1228. A.1.1 Commands 
  1229. -------------- 
  1230.  
  1231. Page 1234.1 
  1232.  
  1233.     RPL->       ( ob            --> $           )       decompile object 
  1234.     ->RPL       ( $             --> ob          )       compile object 
  1235.     DCADR       ( hxs           --> $ hxs'      )       decompile one word 
  1236.     COD->       ( code          --> $           )       disassemble CODE 
  1237.     ->COD       ( $             --> code libdat )       assemble CODE 
  1238.     ->OB        ( ob            --> ob'         ) 
  1239.  
  1240. Page 1234.2 
  1241.  
  1242.     DAN         ( hxs %n        --> $1 .. $n hxs' )     disassemble n times 
  1243.     DA1         ( hxs           --> $ hxs'      )       disassemble one mnemo 
  1244.     DAXY        ( hxs hxs       --> $           )       disassemble block 
  1245.     SYM->       ( libdat        --> $           )       convert symbol table 
  1246.     $->         ( $             --> ob          )       hex-dump to object 
  1247.     ->$         ( ob            --> $           )       object to hex-dump 
  1248.  
  1249. Page 1234.3 
  1250.  
  1251.     EC          (               --> ?           )       entries catalog 
  1252.     E<->A       ( hxs | $name   --> $name | hxs )       get name/address 
  1253.     RPLtab      (               --> $           )       recall ref. table 
  1254.     4/5/7       (               -->             )       sys-stack display 
  1255.     CC          (               --> ?           )       character set catalog 
  1256.  
  1257.  
  1258. A.1.2 Flag Usage 
  1259. ---------------- 
  1260.  
  1261. General: 
  1262.  
  1263.     Flag        Meaning 
  1264.     ----        ------- 
  1265.      -4         If set, RPL->/DCADR are using the disassembler to decompile 
  1266.                 code objects. Unresolved entries are generated as 'ASSEMBLE 
  1267.                 \n\tCON(5)\t#xxxxx\nRPL' instead of 'PTR xxxxx'. 
  1268.     -13         Quiet mode if set. The status report of RPL->, ->RPL, COD-> 
  1269.                 and ->COD is suppressed. 
  1270.     -27         Set by 4/5/7 to signal an active medium font display. Can 
  1271.                 be cleared to quit the sys-stack. 
  1272.     -28         Toggles sys-stack between 5/7 lines mode. 
  1273.     -29         Toggles the behaivior of the down arrow key during sys-stack 
  1274.                 display and the EDIT menu key during the sys-i-stack. If set, 
  1275.                 you can edit objects in sys-RPL syntax. A menu toggle for this 
  1276.                 flag can be found on the 3rd page of the i-stack menu (labeled 
  1277.                 SYS). 
  1278.  
  1279. DAN and DA1 are using the following flags: 
  1280.  
  1281.     Flag (set)  Meaning 
  1282.     ----------  ------- 
  1283.       1         next instr is a GO/RET YES/NO 
  1284.       2         last instr was RET... 
  1285.       3         last instr was GO C/NC/TO 
  1286.       4         last instr was relative GOSUB 
  1287.       5         last instr was absolute GO 
  1288.       6         last instr was PC manipulation 
  1289.       7         used internaly 
  1290.       8         last instr was absolute GO or Dx=(5) 
  1291.  
  1292.  
  1293. A.1.3 Error Messages 
  1294. -------------------- 
  1295.  
  1296. General Errormessages: 
  1297.  
  1298.     "Missing Library" 
  1299.         Requests to execute a command when the <-RPL-> library is not attached 
  1300.         to the HOME directory will cause this error. 
  1301.  
  1302.     "Need Binary Number" 
  1303.         The object passed to DCADR or DA1 isn't a binary number. 
  1304.  
  1305.     "Need String" 
  1306.         The object passed to ->RPL, ->COD or $-> isn't a string. 
  1307.  
  1308.     "Data Modifies Stack" 
  1309.         The object stored as RPL.TAB or ECpar doesn't add one item to the 
  1310.         stack. 
  1311.  
  1312.     "Where's your Program ?" 
  1313.         The string passed to ->RPL results to nothing. 
  1314.  
  1315.     "Primitive Code Object" 
  1316.         The object passed to RPL-> or the address passed to DCADR points to 
  1317.         a PCO. 
  1318.  
  1319. ->COD Errormessages: 
  1320.  
  1321.     ->COD generates error messages of the following form: 
  1322.         "->COD Error: Pos x:yy 
  1323.          Message" 
  1324.     where 'x' is the INCLUDE nesting depth and 'yy' is the character offset of 
  1325.     the first character following the token that caused the error. 'Message' 
  1326.     may be one of the following: 
  1327.  
  1328.     "ENDIF Expected"            an IF isn't matched by an ENDIF 
  1329.     "ENDIF w/o IF"              missplaced ENDIF 
  1330.     "ELSE w/o IF"               missplaced ELSE 
  1331.     "Invalid Parameter"         invalid parameter field 
  1332.     "Inv. Expr"                 invalid parameter field expression 
  1333.     "Invalid Mnemonic"          invalid menemonic 
  1334.     "Duplicate Label"           double defined label 
  1335.     "GOYES/RTNYES Expected"     comparisation without a following 
  1336.                                 conditional jump 
  1337.     "GOYES out of range"        jump destination is more than -128/+127 
  1338.                                 nibbles away 
  1339.     "Parameter Expected"        parameter of a mnemonic which expects 
  1340.                                 one is missing 
  1341.     "Unknown Symbol"            unknown symbol in an expression 
  1342.     "Invalid String"            invalid string constant 
  1343.     "No IF Nesting Yet"         nesting of conditional IF .. ELSE .. ENDIF 
  1344.                                 structures is not allowed (yet). 
  1345.  
  1346. ->RPL Errormessages: 
  1347.  
  1348.     ->RPL generates error messages of the following form: 
  1349.         "->RPL Error: Pos x:yy 
  1350.          Message" 
  1351.     where 'x' is the INCLUDE nesting depth and 'yy' is the character offset of 
  1352.     the first character following the token that caused the error. 'Message' 
  1353.     may be one of the following (additional to the ones listed for ->COD): 
  1354.  
  1355.     "; or } Expected" 
  1356.         Missing a ; to terminate a program, list, UNIT or SYMBOL 
  1357.  
  1358.     ") Expected" 
  1359.         Missing a ) to terminate a comment 
  1360.  
  1361.     "" Expected" 
  1362.         Missing a " to terminate a string 
  1363.  
  1364.     "Misplaced ; or }" 
  1365.         Found a ; or } without a opening ::, {, UNIT or SYMBOL 
  1366.  
  1367.     "Suspect %" 
  1368.     "Suspect %%" 
  1369.         Parsing of a number results in an object of incorrect type. 
  1370.  
  1371.     "Body Len <> Datalen" 
  1372.         The length field of a HXS-like styled statement is not equal to 
  1373.         the data length 
  1374.  
  1375.     "More Tokens Expected" 
  1376.         The statement at the end of the input string is incomplete 
  1377.  
  1378.     In the following messages 'ttt' represents the token that causes the 
  1379.     error: 
  1380.  
  1381.     "ROMP LibID >FFF: ttt" 
  1382.     "ROMP ROMWD >FFF: ttt" 
  1383.         The library ID part or the ROM word number part of a ROMPTR statement 
  1384.         is > FFF 
  1385.  
  1386.     "Suspect \ Seq: ttt" 
  1387.         The escape sequence ttt in the string, ID or LAM is incomplete or 
  1388.         invalid 
  1389.  
  1390.     "Can't INCLUDE: ttt" 
  1391.     "Can't INCLOB: ttt" 
  1392.         There's no variable with the name ttt 
  1393.  
  1394.     "Inv. xxx: ttt" 
  1395.         where 'xxx' is one of the following: 
  1396.  
  1397.         "Tok"   - ttt is unresolvable 
  1398.         "#"     - ttt is out of range or contains other chars than hex digits 
  1399.         "$"     - ttt doesn't start with a " 
  1400.         "%","%%"- ttt represents not a valid number 
  1401.         "PTR"   - ttt is out of range or contains other chars than hex digits 
  1402.         "CHR"   - ttt contains more than one char 
  1403.  
  1404.         "Body Dat" - the data field of a HXS-like styled statement contains 
  1405.                      other chars than hex digits 
  1406.         "Body len" - the length field of a HXS-like styled statement contains 
  1407.                      other chars than hex digits 
  1408.         "ROMP RW"  - the ROM word number field of a ROMPTR is longer than 5 
  1409.                      chars or contains other chars than hex digits 
  1410.         "ROMP LI"  - the library ID field of a ROMPTR is longer than 5 chars 
  1411.                      or contains other chars than hex digits 
  1412.  
  1413.  
  1414. A.2 <-LIB-> 
  1415. =========== 
  1416.  
  1417.  
  1418. A.2.1 Commands 
  1419. -------------- 
  1420.  
  1421. Page 1221.1 
  1422.  
  1423.     D->LIB      (               --> lib         )       build library 
  1424.     L->DIR      ( %             --> dir         )       split library 
  1425.     MCFG        (               -->             )       make config program 
  1426.     ML->D       (               --> prg         )       make libdat-> handler 
  1427.     MD->L       (               --> prg         )       make ->libdat handler 
  1428.     OB->        ( ob            --> ?           )       split object 
  1429.  
  1430. Page 1221.2 
  1431.  
  1432.     ->DIR       ( meta(ob,id)   --> dir         )       make directory 
  1433.     ->PRG       ( meta(ob)      --> prg         )       make program 
  1434.     ->XLIB      ( % % | # #     --> xlib        )       make XLIB 
  1435.     ->ARR       ( meta(ob)      --> arry        )       make array 
  1436.     ->ALG       ( meta(ob)      --> alg         )       make algebraics 
  1437.     ->LD        ( {} %          --> libdta      )       make library data 
  1438.  
  1439. Page 1221.3 
  1440.  
  1441.     ->BAK       ( ob $          --> bak         )       make backup 
  1442.     ->ID        ( $             --> id          )       make identifier 
  1443.     ADRp        ( ob            --> ob #        )       get address of object 
  1444.     $romid      (               --> id          )       get id '$ROMID' 
  1445.     $visible    (               --> id          )       get id '$VISIBLE' 
  1446.     $title      (               --> id          )       get id '$TITLE' 
  1447.  
  1448. Page 1221.4 
  1449.  
  1450.     $config     (               --> id          )       get id '$CONFIG' 
  1451.     $vars       (               --> id          )       get id '$VARS' 
  1452.     $hidden     (               --> id          )       get id '$HIDDEN' 
  1453.     $message    (               --> id          )       get id '$MESSAGE' 
  1454.     LBCRC       ( lib | bak     --> lib' | bak' )       recalculate CRC 
  1455.     RNLIB       ( lib $         --> lib'        )       rename library 
  1456.  
  1457. Page 1221.5 
  1458.  
  1459.     CHLID       ( lib %         --> lib'        )       change LID 
  1460.     RHASH       ( %             --> C#          )       get hash table 
  1461.     RLINK       ( %             --> C#          )       get link table 
  1462.     RCFG        ( %             --> prg         )       get config code 
  1463.     RMSG        ( %             --> arry        )       get message table 
  1464.     RTITLE      ( %             --> $           )       get title 
  1465.  
  1466. Page 1221.6 
  1467.  
  1468.     RPORT       ( %             --> ob ...      )       recall port 
  1469.     RLIB        ( %             --> lib % ...   )       recall library(s) 
  1470.     PGLIB       ( % | :%:%      -->             )       purge library 
  1471.     STLIB       ( lib %         -->             )       store library 
  1472.     ACLIB       ( :%:%          -->             )       activate library 
  1473.     LIBp        ( %             --> $           )       get library layout 
  1474.  
  1475. Page 1221.7 
  1476.  
  1477.     INSTp       (               --> {}          )       get installed LIDs 
  1478.     LIBSp       (               --> {}          )       get all LIDs on 48 
  1479.     fEVAL       ( ob            --> ?           )       fast EVAL 
  1480.  
  1481.  
  1482. A.2.2 Flag Usage 
  1483. ---------------- 
  1484.  
  1485. 5       Set:    STLIB executes config code of passed library after 
  1486.                 installation. 
  1487.                 ACLIB executes config code of activated library. 
  1488.                 <-LIB->s config code displays (c) notice. 
  1489.         Clear:  STLIB and ACLIB simply attaches handled library to 
  1490.                 the HOME directory. 
  1491.                 <-LIB->s config code don't display (c) notice. 
  1492.  
  1493. 6       Set:    L->DIR places the $control variables at the end of the 
  1494.                 generated directory. 
  1495.         Clear:  L->DIR places the $control variables at the beginning of 
  1496.                 the generated directory. 
  1497.  
  1498. 7       Set:    L->DIR generates a $HIDDEN but no $VISIBLE variable. 
  1499.         Clear:  L->DIR generates a $VISIBLE but no $HIDDEN variable. 
  1500.  
  1501. -13     Set:    D->LIB/L->DIR are switching the display off while processing 
  1502.                 a directory/library (fast mode). 
  1503.         Clear:  D->LIB/L->DIR are leaving the display on while working. 
  1504.  
  1505.  
  1506. A.2.3 Error Messages 
  1507. -------------------- 
  1508.  
  1509. "Missing $ROMID" 
  1510.     $ROMID is not defined in the current directory 
  1511.  
  1512. "$ROMID Not Real/Binary" 
  1513.     $ROMID doesn't contain a real or binary object 
  1514.  
  1515. "$ROMID Out of Range" 
  1516.     a) The value of $ROMID is > 2047 
  1517.     b) A real > 2047 was passed to CHLID 
  1518.  
  1519. "$CONFIG Not a Program" 
  1520.     Because the stack must not change during warmstarts, $CONFIG must contain 
  1521.     a program 
  1522.  
  1523.     Note: Use 1 ->PRG to embedd CODE, IDs or XLIBs into a program. 
  1524.  
  1525. "$HIDDEN Not a List" 
  1526. "$VISIBLE Not a List" 
  1527. "$VARS Not a List" 
  1528. "$MESSAGE Not a List" 
  1529.     $XXX must contain a list 
  1530.  
  1531. "Found ID Name>16 Chars" 
  1532.     D->LIB have found a visible command name which is > 16 chars in size 
  1533.  
  1534. "Found 0-ID" 
  1535.     D->LIB have found a visible command name with the size 0 
  1536.  
  1537.  
  1538. Appendix B - A ->COD Example 
  1539. ============================ 
  1540.  
  1541.  
  1542. Key in the following text (including the string delimiters) on your HP48 (you 
  1543. may leave out the comments): 
  1544.  
  1545. "       GOSBVL  =SAVPTR         ** Save RPL pointers in save locations 
  1546. **                                 P is 0 , HEX mode enabled 
  1547.         LAHEX   123AFE          ** Load HEX nibbles into A Register 
  1548. **                                 starting at P 
  1549.         P=      5               ** 
  1550.         GOVLNG  =PUSHhxsLoop    ** Push A[WP] onto Data stack 
  1551. **                                 and pass control to RPL 
  1552.  
  1553. Store it in the variable SRC1. Recall the text to the stack, then press 
  1554. [->COD]. The display will show 'ASSEMBLER PASS 1' on the bottom line. 
  1555. In the upper part of the display 'Line  nnn' will appear, where <nnn> 
  1556. represents the actual code line to be assembled (empty lines or comment 
  1557. lines are not counted). 
  1558.  
  1559. A second later the display will show 'ASSEMBLER PASS 2' on the bottom line and 
  1560. 'Processing nnn Lines' in the message area. Another second later the source 
  1561. will have been assembled and the the string will be replaced by a 'Code' 
  1562. object and a 'Library Data' object. The stack should look as follows: 
  1563.  
  1564. +---------------------+ 
  1565. |                     | 
  1566. +---------------------+ 
  1567. |4:                   | 
  1568. |3:                   | 
  1569. |2:               Code| 
  1570. |1:       Library Data| 
  1571. ### ### ### ### ### ### 
  1572. +---------------------+ 
  1573.  
  1574.  
  1575. The Library Data object contains all used local symbols (eg. labels). For the 
  1576. above example, it is an empty string as there are no local symbols. The Code 
  1577. object represents the assembled source text. DROP the Library Data object and 
  1578. store the Code object into 'XQ1', then press the menu key [XQ1] . The stack 
  1579. now looks like: 
  1580.  
  1581. +---------------------+ 
  1582. |                     | 
  1583. +---------------------+ 
  1584. |4:                   | 
  1585. |3:                   | 
  1586. |2:                   | 
  1587. |1:          # 123AFEh| 
  1588. ### ### ### ### ### ### 
  1589. +---------------------+ 
  1590.  
  1591.  
  1592. Now lets change example 1 to make use of the symbolic facilities of SASM48. 
  1593. First recall [SRC1] and edit the string: 
  1594.  
  1595. hexdig  EQU     #123AFE 
  1596. pHXS    EQU     5 
  1597.         GOSBVL  =SAVPTR         ** Save RPL pointers in save locations 
  1598. **                                 P is 0 , HEX mode enabled 
  1599.         LA(6)   hexdig          ** Load 6 HEX nibbles (represented by hexdig) 
  1600. **                                 into A Register , starting at P 
  1601.         P=      pHXS            ** Set P to the value specified by pHXS 
  1602.         GOVLNG  =PUSHhxsLoop    ** Push A[WP] onto Data stack 
  1603. **                                 and pass control to RPL 
  1604.  
  1605. Store the string in SRC2, recall it back to the stack, then press [->COD]. The 
  1606. result looks like the result of example 1 except that the Library Data now 
  1607. contains the values of the defined labels. When the stack shows: 
  1608.  
  1609. +---------------------+ 
  1610. |                     | 
  1611. +---------------------+ 
  1612. |4:                   | 
  1613. |3:                   | 
  1614. |2:               Code| 
  1615. |1:       Library Data| 
  1616. ### ### ### ### ### ### 
  1617. +---------------------+ 
  1618.  
  1619. press [SYM->] (located on the second menu page). The display changes to: 
  1620.  
  1621. +---------------------+ 
  1622. |                     | 
  1623. +---------------------+ 
  1624. |4:                   | 
  1625. |3:                   | 
  1626. |2:               Code| 
  1627. |1: "hexdig  EQU   #..| 
  1628. ### ### ### ### ### ### 
  1629. +---------------------+ 
  1630.  
  1631.  
  1632. Press the down-arrow key: 
  1633.  
  1634. +---------------------+ 
  1635. |                  prg| 
  1636. +---------------------+ 
  1637. |                     | 
  1638. |                     | 
  1639. |"hexdig  EQU   #123..| 
  1640. |pHXS    EQU   #5     | 
  1641. ### ### ### ### ### ### 
  1642. +---------------------+ 
  1643.  
  1644. This is the symbol table for SRC2. Press ATTN to return to the stack. DROP the 
  1645. string in level 1 and store the Code object into 'XQ2'. Press [XQ2]. You will 
  1646. get the same result as in example 1 because it's the same machine language 
  1647. program. 
  1648.  
  1649. You could even use [COD->] to disassemble the Code object in level 1. 
  1650.  
  1651.  
  1652. Appendix C - Ordering Information 
  1653. ================================= 
  1654.  
  1655.  
  1656. The sources of the <-RPL-> and the <-LIB-> libraries consists of more than 
  1657. 15000 lines of RPL/assembler code (that's more than 250kb of text !) and we 
  1658. spend our free time of more than one year on writing RPL48, so we decided to 
  1659. release this version as GiftWare and probably the first non-beta version as 
  1660. ShareWare. 
  1661.  
  1662. Anyway, this release is a GiftWare release, ie. you can use RPL48 as long as 
  1663. you like but only for developing non-comercial software and as a private 
  1664. person. If you think RPL48 is usefull and the authors are worth to be rewarded 
  1665. for the time they have invested in developing this toolkit, feel free to send 
  1666. one of us (or both ;-) any sort of gift (even only a postcard will be wellcome). 
  1667. If your gift covers the expense sending you a disk via SnailMail (costs are: 
  1668. the disk, an envelope, the stamp and our time -> ~20$ or something equivalent), 
  1669. we will send you the latest version of RPL48 on a MesS-DOS formatted disk 
  1670. (including the <-RPL-> library branded with your name in the startup message). 
  1671. Don't forget to include your name, address and the disk size you prefer. 
  1672.  
  1673. Developing commercial software using RPL48 requires registration via the 
  1674. GiftWare concept; companies have to send us at least a 50$-worth gift for 
  1675. registration. 
  1676.  
  1677. Planned for the future are: 
  1678.     - ROM rev J support         (if there are problems) 
  1679.     - better ARRY support in <-RPL-> 
  1680.     - maybe a DIR support in <-RPL-> 
  1681.     - a system RPL debugger     (hairy) 
  1682.     - a MKROM command which will allow a library creation similar to 
  1683.       MAKEROM.EXE 
  1684.     - a string editor           (hairy) 
  1685.     - support of the new HP calc... 
  1686.  
  1687. (all without guaranteeing the implementation) 
  1688.  
  1689. Contact addresses: 
  1690.  
  1691.         Detlef Mueller                  Raymond Hellstern 
  1692.         Bellerbek 33                    Liebigstr. 8 
  1693.         W-2000 Hamburg 56               W-3000 Hannover 1 
  1694.         Germany                         Germany 
  1695.  
  1696.         Tel. +49 40 811 92 80           Tel./FAX +49 511 66 10 11 
  1697.  
  1698.         e-mail: detlef@dmhh.hanse.de 
  1699. -- 
  1700.